% Вторая глава работы 
\chapter{Distributed Network Address Translation}
\label{chap2}

\section{Архитектура}
\label{chap2:sec1}
Положим, что каждый хост имеет свой внутренний IP--адрес, который должен быть транслирован во внешний. При реализации механизма DNAT, стеки протокола TCP/IP запрограммированы на хостах таким образом, что их IP--уровни используют локальные адреса для связи внутри подсети. В то же время пакеты, направленные на удаленные хосты, проходят через DNAT--маршрутизатор. 

Таким образом, каждый из внутренних хостов имеет 2 IP--адреса: локальный адрес и адрес подсети. Последний как раз и является внешним адресом DNAT--маршрутизатора. Для того, чтобы маршрутизатору не приходилось транслировать все порты, хосты настраивают на использование некоторого количества внутренне локальных портов для всех внешних запросов.

\section{Протокол Распределения Портов}
\label{chap2:sec2}
Чтобы избежать конфликтов портов, используется Протокол Распределения Портов (Port Distribution Protocol, PDP). Суть его состоит в генерации случайных номеров портов для каждого из внутренних хостов. Протокол  состоит из трех частей:
\begin{itemize}
\item PDP--запрос
\item PDP--ответ
\item PDP--аннуляция
\end{itemize}

PDP--запрос посылается от хоста к маршрутизатору для получения блока портов. К IP--заголовку прибавляется следующее:
\begin{figure}[!h!]
 \centerline{\includegraphics[width=0.7\textwidth]{PDP-rec}}
 \caption{PDP--запрос}
\label{fig1}
\end{figure}

Поля соответствуют ICMP (Internet Control Message Protocol) и имеют следующие характеристики:
\begin{itemize}
\item Тип (Type) --- 1 байт
\item Код (Code) --- 1 байт: 0 для портов свыше 10000, 128 для портов ниже 10000.
\item Контрольная сумма (Checksum) --- 2 байта: шестнадцатибитное дополнение до единицы суммы дополнения до единицы всего запроса. В целях облегчения подсчета контрольной суммы изначально ее поле равно 0.
\item Запрашиваемые порты (Ports requested) --- 1 байт: количество портов, запрашиваемых хостом. Предполагаемыми значениями являются либо 16, либо 32, что является достаточным для нужд большинства хостов.
\item Неиспользуемое (Unused) --- 3 байта: 0.
\end{itemize}

Хост отправляет PDP--запрос сразу после загрузки. Положительный или отрицательный PDP--ответ посылается от маршрутизатора к хосту. Дополнение к IP--заголовку имеет следующий формат:
\begin{figure}[!h!]
 \centerline{\includegraphics[width=0.7\textwidth]{PDPresponse}}
 \caption{PDP--ответ}
\label{fig1}
\end{figure}
Поля определены как:
\begin{itemize}
\item Тип (Type) --- 1 байт
\item Код (Code) --- 1 байт: 0 для портов свыше 10000, 128 для портов ниже 10000.
\item Контрольная сумма (Checksum) --- 2 байта: шестнадцатибитное дополнение до единицы суммы дополнения до единицы всего запроса. В целях облегчения подсчета контрольной суммы изначально ее поле равно 0.
\item Нижний порт (Lowest port) --- 2 байта: Номер нижнего порта в блоке.
\item Количество портов (Total ports) --- 1 байт: Общее количество портов, выделенных хосту.
\item Неиспользуемое (Unused) --- 3 байта: 0.
\end{itemize}

При получении положительного PDP--ответа хост заносит в память информацию о выделенном ему блоке портов. В процессе обмена пакетами он помечает их как используемые или свободные. При получении отрицательного PDP--ответа хост может послать другой запрос на меньшее количество портов. Если маршрутизатор не может выделить запрашиваемый блок смежных портов для хоста, он может ответить с положительным статусом, но выделить меньше портов, чем запрашивалось.
Маршрутизатор хранит у себя таблицу соответствий портов внешним IP--адресам в PTIP--таблице (Port-To-IP Table). Пример записи из PTIP--таблицы приведен ниже. Для одного и того же IP--адреса может быть существовать несколько записей.
\begin{figure}[!h!]
 \centerline{\includegraphics[width=0.7\textwidth]{PDPinvalidate}}
 \caption{PTIP--таблица}
\label{fig2}
\end{figure}

PDP--аннуляция используется для освобождения портов, которые на данный момент привязаны к одному из хостов. Он имеет следующий формат:

\begin{figure}[!h!]
 \centerline{\includegraphics[width=0.7\textwidth]{FilePTIP}}
 \caption{PDP аннуляция}
\label{fig3}
\end{figure}

Поля определяются следующим образом:
\begin{itemize}
\item Тип(Type) --- 1 байт:32.
\item Код(Code) --- 1 байт: 2.
\item Контрольная сумма(Checksum) - 2 байта: 16 бит  довершение первой суммы дополнения всего запроса.  В целях облегчения подсчета контрольной суммы изначально ее поле равно 0. 
\item Порт(Port) --- 1 байт: Номер порта, используемого хостом.
\item Неиспользуемое (Unused) --- 3 байта: 0.
\end{itemize}

Возможно, что 2 хоста были расположены ошибочно, перекрывая блоки портовых номеров(например, в результате сбоя или перезагрузки маршрутизатора). При приеме пакета от хоста к Интернету, маршрутизатор должен проверять PTIP -- таблицу для уверенности, что номер source port среди блоков, привязанных к хосту. Если порт с этим номером не привязан к хосту, маршрутизатор не может идентифицировать пакет, отклоняет его и посылает PDP аннуляция хосту.При получении  PDP аннуляциясообщения, хост должен прекратить использование всех используемых на данный момент портов и запросить новый блок портов. PDP--аннуляция также может использоваться для предотвращения простоя портов, заставив хост освободить несколько или даже все порты, которые были зарезервированы. Маршрутизатор должен послать PDP аннуляция к любому хосту, который связан с внешним хостом более, чем 10 минут. Когда маршрутизатор перезагружается, он должен признать недействительным все привязанные порты посылкой PDP--аннуляция к каждому хоcту.Когда порт или некоторое множество портов на хосте не действительны, все текущие транзакции между хостом и внешними сервером будут прерваны. DNAT маршрутизатор должен попытаться «загасить» недавно признанные недействительные номера порта на некоторый период времени, так что они небудут связаны с хостом, пока внешний сервер все еще пытается передать номера портов.

\section{Диаграммы взаимодействия}
\label{chap2:sec3}
В данной секции будет проиллюстрировано взаимодействие между локальным хостом и DNAT маршрутизатором с помощью блок-схем. Когда хост связывается с внешним сервером, он посылает канальные IP -- пакеты в локальную подсеть. Заголовок исходящего IP -- пакеты будет содержать локальный IP хоста как ресурса и локальный IP -- адреса маршрутизатора как пункта назначения. Заголовок входящего IP-пакеты будет содержать внешний IP -- подсети как адрес ресурса и IP--адрес внешнего сервера как пункта назначения. Порт ресурса должен быть уникальным для локальной сети. При отсутствии свободного порта необходимо зарезервировать еще один с помощью PDP--запроса. Когда хост передает данные другому локальному хосту, ни туннелей ни локально уникального порта ресурсов не требуется. 

%Рисунок DNAT host transmission process. 
\begin{figure}[!h!]
 \centerline{\includegraphics[width=0.7\textwidth]{DNATHostTransmissionProcess}}
 \caption{Процесс передачи DNAT -- хоста}
\label{fig3}
\end{figure}


Остается  вопрос, как локальный хост может  определить, является ли передача внешней  или внутренней. Так как не одна подсеть может стоять за DNAT маршрутизатором, проверка масок локальных подсетей не сработает. Для решения этой проблемы есть альтернативный путь: требуется, что бы DNAT маршрутизатор знал все маски подсетей, используемые DNAT подсетями, с которыми он работает.

\begin{figure}[!h!]
 \centerline{\includegraphics[width=0.7\textwidth]{DNATRouterOperationsOnOutgoingPackets}}
 \caption{Операции DNAT -- маршрутизатора над исходящими пакетами}
\label{fig3}
\end{figure}

Когда туннельный пакет, отправленный локальным хостом, достигает DNAT маршрутизатора, маршрутизатор должен свериться со своей PTIP -- таблицей, что IP -- адрес ресурса есть среди разрешенных хостом. Если нет, то маршрутизатор пересылает PDP--аннуляция  и отклоняет пакет.


%Рисунок DNAT router operations on incoming packets. 

\begin{figure}[!h!]
 \centerline{\includegraphics[width=0.7\textwidth]{DNATRouterOperationsOnIncomingPackets}}
 \caption{Операции DNAT -- маршрутизатора над входящими пакетами}
\label{fig3}
\end{figure}
Когда DNAT маршрутизатор получает пакет от внешнего хоста, маршрутизатор первым делом удостоверивается, что получающий порт зарегистрирован в PTIP -- таблице. Если его не оказывается, пакет удаляется, а внешнему серверу отправлется сообщение об ошибке. Иначе, DNAT -- маршрутизатор находит IP -- адрес пункта назначения в PTIP -- таблице.
Когда DNAT -- хост получает пакет, первым делом он определяет, какой ресурс: внутренний или внешний. Это возможно благодаря проверке следующего поля протокола исходящего IP -- заголовка. Если ресурс --- локальный, может быть использовано нормальное получение. Если внешний, исходящий IP -- заголовок должен быть раскрыт и тогда возможна обычная передача.

%Рисунок DNAT host reception process. 
\begin{figure}[!h!]
 \centerline{\includegraphics[width=0.7\textwidth]{DNATHostReceptionProcess}}
 \caption{Процесс получения DNAT -- хоста}
\label{fig3}
\end{figure}
\cite{lit3}

%%% Local Variables:
%%% mode: latex
%%% coding: utf-8-unix
%%% TeX-master: "../default"
%%% End:
